package fr.channel.server;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.channel.ChannelMessage;
import com.google.appengine.api.channel.ChannelService;
import com.google.appengine.api.channel.ChannelServiceFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import fr.channel.client.PartieService;
import fr.channel.server.metier.SbChannel;
import fr.channel.server.metier.SuPartie;
import fr.channel.server.model.Joueur;
import fr.channel.server.model.Partie;
import fr.channel.shared.dto.PartieDTO;
import fr.channel.shared.dto.Reponse;

/**
 * Implementation du service RPC attendu par le client.
 * 
 * @author Matthieu
 * 
 */
public class PartieServiceImpl extends RemoteServiceServlet implements PartieService {

	/** */
	private static final long serialVersionUID = 7891144864590635326L;

	/**
	 * On concatene le nom de la partie et le nom du joueur pour creer le token
	 * du channel.
	 */
	private static final String TOKEN_PATTERN = "{0}-{1}";

	private SbChannel sbChannel = new SbChannel();

	@Override
	public final Reponse<String> createPartie(final String namePartie, final String nameJoueur) {
		ChannelService channelService = ChannelServiceFactory.getChannelService();
		String clientId = MessageFormat.format(TOKEN_PATTERN, namePartie, nameJoueur);
		String token = channelService.createChannel(clientId);

		List<Joueur> joueurs = sbChannel.getAllJoueurs();
		for (Joueur joueur : joueurs) {
			if (nameJoueur != null  && nameJoueur.equals(joueur.getName())) {
				return ReponseFactory.getErrorReponse("Joueur deja present");
			}
		}
		// On previent tout le monde que quelqu'un arrive
		for (Joueur joueur : joueurs) {
			channelService.sendMessage(new ChannelMessage(joueur.getCliendId(), "Voila un nouveau joueur! : "
			        + nameJoueur));
		}

		// On regarde si la partie existe
		Partie partie = sbChannel.findPartieByName(namePartie);
		if (partie == null) {
			partie = new Partie(namePartie);
			partie.setJoueurs(new ArrayList<Joueur>());
		}
		Joueur joueur = new Joueur(nameJoueur);
		joueur.setCliendId(clientId);
		partie.getJoueurs().add(joueur);

		sbChannel.save(partie);
		return ReponseFactory.getSucessReponse(token);
	}

	@Override
	public final List<PartieDTO> getParties() {
		return SuPartie.buildPartiesDTO(sbChannel.getAllParties());
	}

}
